#ifndef CAPAASINCRONA_H
#define CAPAASINCRONA_H

#include <QMutex>
#include "capa.h"

class VISOR2D_EXPORT Peticion
{
public:
    QRectF encuadreReal;
    int anchoPixeles;
    int altoPixeles;

    Peticion() {
        anchoPixeles = 0;
        altoPixeles = 0;
    }

    Peticion(QRectF encuadreReal, int anchoPixeles, int altoPixeles) {
        this->encuadreReal = encuadreReal;
        this->anchoPixeles = anchoPixeles;
        this->altoPixeles = altoPixeles;
    }

    bool esValida() {
        return anchoPixeles != 0 && altoPixeles != 0;
    }
};

class VISOR2D_EXPORT CapaAsincrona : public Capa
{
    Q_OBJECT

public:
    CapaAsincrona();
    virtual ~CapaAsincrona();

    void pedirImagen(QRectF encuadreReal, int anchoPixeles, int altoPixeles);
	//bool hayPeticionPendiente();
    bool isProcesando() { return peticionActual.esValida(); }

    void limpiar();

protected:
    virtual void realizarPeticion(Peticion peticion) = 0;
    void peticionRecibida(QImage imagen);
    void peticionFallida(QString mensaje);
    void comprobarPeticionPendiente();

    QImage getImagenActual(QRectF& encuadreReal) {
        QMutexLocker locker(&mutex);
        encuadreReal = this->encuadreReal;
        return imagen;
    }

protected:
    Peticion peticionActual;
    Peticion peticionPendiente;

    QMutex mutex;
    QImage imagen;
    QRectF encuadreReal;
};

#endif // CAPAASINCRONA_H
